home *** CD-ROM | disk | FTP | other *** search
/ Acorn RISC PD-CD 1 / Acorn RISC PD-CD 1.iso / languages / hope / hopearchie < prev    next >
Text File  |  1990-04-25  |  18KB  |  529 lines

  1.  
  2.  
  3.  
  4.  
  5.       U S I N G   I C - H O P E   O N   T H E   A R C H I M E D E S
  6.  
  7.  
  8.  
  9.  
  10. 1.   Introduction and disclaimer
  11.  
  12. The Imperial College HOPE interpreter (IC-HOPE) is  an  experimental  tool
  13. originating  in  the  Functional  Programming  Group  of the Department of
  14. Computing.  Neither the implementation nor the documentation are  complete
  15. yet.   The  interpreter  should  be  regarded  only  as an introduction to
  16. functional  programming  and  the  HOPE  language,  not  as  a  basis  for
  17. developing large items of software.
  18.  
  19. This document describes how to use the IC-HOPE interpreter  on  the  Acorn
  20. Archimedes,  under RISC OS.  It does not document the IC-HOPE language and
  21. should be read in conjunction with the "Hope Tutorial" in the August  1985
  22. edition  of  BYTE  Magazine,  a copy of which is on the distribution disk,
  23. entitled 'HopeTutorl'.
  24.  
  25.  
  26.  
  27. 2.   Running the interpreter
  28.  
  29. After invoking the interpreter, the current directory will be displayed at
  30. the  top of the screen.  Beneath this, a banner with the version number of
  31. the interpreter will be printed, followed by the prompt ">:".
  32.  
  33.      ************** IC-HOPE version 4.02A (c) ICST 1989 **************
  34.      **                                                             **
  35.      **     Welcome to the functional programming language HOPE     **
  36.      **                                                             **
  37.      ************* Warning - incomplete implementation! **************
  38. >:
  39.  
  40. You can now start entering programs as described below.
  41.  
  42.  
  43.  
  44. 3.   Character set
  45.  
  46.      The interpreter recognises the following character set:
  47.  
  48.      letters:       _ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  49.                       a b c d e f g h i j k l m n o p q r s t u v w x y z
  50.  
  51.      digits:        0 1 2 3 4 5 6 7 8 9
  52.  
  53.      operators:     ` | \ ~ @ # $ % ^ & * - + = : . ? /
  54.  
  55.      punctuation:   ! ( ) { } [ ] ; , " '
  56.  
  57.      layout:        space tab newline
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. Using IC-Hope on the Archimedes                                      Page 1
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71. 4.   Lexical conventions
  72.  
  73. An IC-HOPE program is a sequence of  words.   A  word  is  a  sequence  of
  74. digits, one character in single quotes, a sequence of characters in double
  75. quotes, a single  punctuation  character,  an  identifier  or  a  comment.
  76. Single-quote  within  single  quotes and double quote within double quotes
  77. are self-escaped and must be doubled.  An  identifier  is  a  sequence  of
  78. letters  and  digits  starting  with  a  letter  or a sequence of operator
  79. characters; only the first 240 characters are significant.
  80.  
  81. Adjacent words formed from the same class  of  non-punctuation  characters
  82. must   be   separated  by  a  layout  character.   Layout  characters  are
  83. significant within double quotes except  that  newline  is  treated  as  a
  84. space.  A comment is a sequence of characters starting with an exclamation
  85. mark and ending with a newline or another exclamation mark.  Comments  are
  86. treated  as  layout  characters  and  ignored.   The  following words have
  87. predefined  meanings  to  the  interpreter  and  should  not  be  used  as
  88. identifiers:
  89.  
  90.     <  <>  <=  +  ++  |  &  *  -  ---  ->  /=  _  >  >=   :   ::   :::
  91.     #  =  =<  =>  ==  alpha  and  beta  bisect  char  close  data  dec
  92.     display  div  echo  else   empty  end  eof   exit  false   getchar
  93.     in   infix  intersect  isin   lambda  let  list   load  minus  mod
  94.     modify   nil  nl   nonop  not   notrace  num   openin  openout  or
  95.     print   putchar  putlist   save  set   size  show   split   stream
  96.     subset  succ   system   then   time   trace   true   truval   type
  97.     typevar  union  void  where  width  with  X
  98.  
  99.  
  100.  
  101. 5.   Program order
  102.  
  103. Infix declarations must appear before the  operations  are  used  in  data
  104. definitions,  recursion  equations or expressions.  Type variables must be
  105. declared before they are used in data definitions.  Function  declarations
  106. must  appear  before  any of their recursion equations and before they are
  107. used in expressions.  Mutually recursive data types can be declared  using
  108. the  "with"  connective.   Provided  these  constraints  are observed, the
  109. elements of the program can be entered in any order.
  110.  
  111. The interpreter does not check that the patterns on the left-hand sides of
  112. recursion equations are unique.  At run-time they are checked in the order
  113. they were entered and the  first  equation  with  a  matching  pattern  is
  114. evaluated.  Programs should not be written to take advantage of this.
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130. Using IC-Hope on the Archimedes                                      Page 2
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. 6.   Standard facilities
  138.  
  139. The following declarations may be assumed to be made when the  interpreter
  140. is  loaded  and  the types, type variables, functions and operations which
  141. they introduce may be used without further formality.
  142.  
  143. typevar alpha, beta ;
  144.  
  145.  
  146. type stream == num ;
  147.  
  148.  
  149. infix isin                                : 3 ;
  150. infix <>, ::, :::, or, union              : 4 ;
  151. infix +, -, and, intersect, minus, subset : 5 ;
  152. infix =, <, >, /=, =<, >=, *, div, mod    : 6 ;
  153.  
  154.  
  155. data num            == 0    ++ succ ( num ) ;
  156. data truval         == true ++ false ;
  157. data char           == 'A'  ++ 'B' ++ 'C' ++ ... ;
  158.  
  159. data set ( alpha )  == empty ;
  160. data list ( alpha ) == nil ++ alpha :: list ( alpha ) ++
  161.                         alpha ::: list ( alpha ) ;
  162.  
  163.  
  164. dec  +, -, *, div, mod   : ( num # num ) -> num ;
  165. dec  =, <, =<, >, >=, /= : ( alpha # alpha) -> truval ;
  166. dec  and, or             : ( truval # truval ) -> truval ;
  167. dec  not                 : truval -> truval ;
  168. dec  <>                  : ( list ( alpha ) # list ( alpha ) ) ->
  169.                            list ( alpha ) ;
  170.  
  171. dec close      : stream -> void ;
  172. dec eof        : char ;
  173. dec getchar    : stream -> char ;
  174. dec nl         : char ;
  175. dec show       : alpha -> alpha ;
  176. dec openin     : list ( char ) -> stream ;
  177. dec openout    : list ( char ) -> stream ;
  178. dec print      : list ( char ) -> void ;
  179. dec putchar    : ( stream # char ) -> void ;
  180. dec putlist    : ( list ( list ( char ) ) # stream ) -> void ;
  181.  
  182. dec bisect     : set ( alpha ) -> ( set ( alpha ) # set ( alpha ) ) ;
  183. dec intersect  : ( set ( alpha ) # set ( alpha ) ) -> set ( alpha ) ;
  184. dec isin       : ( alpha # set ( alpha ) ) -> truval ;
  185. dec minus      : ( set ( alpha ) # set ( alpha ) ) -> set ( alpha ) ;
  186. dec size       : set ( alpha ) -> num;
  187. dec split      : set ( alpha ) -> ( alpha # set ( alpha ) ) ;
  188. dec subset     : ( set ( alpha ) # set ( alpha ) ) -> truval ;
  189. dec union      : ( set ( alpha ) # set ( alpha ) ) -> set ( alpha ) ;
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196. Using IC-Hope on the Archimedes                                      Page 3
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203. The full set of constructors for data type "char"  is  the  set  of  ASCII
  204. characters defined in section 3 above.  The relational operators <=, , =<,
  205. >, >= and /= have their usual meanings for "num"  and  "char"  parameters,
  206. with ASCII ordering for characters.  They are not defined for other types,
  207. except for =, which is also defined over structured types.  Functions  and
  208. types  which  are  not  mentioned  in the "Hope tutorial" are described in
  209. section 9 below.
  210.  
  211.  
  212.  
  213. 7.   Binding conventions
  214.  
  215. The  comma  binds  most  weakly,  followed  by  conditionals,  the   "let"
  216. qualifier,  the "where" qualifier, all infix operators in numeric priority
  217. order (highest first), function application (represented by juxtaposition)
  218. and list and set construction using quotes, brackets and braces.
  219.  
  220. In patterns,  "&"  binds  more  tightly  than  comma  or  any  infix  data
  221. constructor.   When  a  program is displayed or saved on disk (see section
  222. 10), all priorities will be shown explicitly by extra parentheses.
  223.  
  224.  
  225.  
  226. 8.   Error messages
  227.  
  228. There are three kinds of error messages. Syntax errors are detected as the
  229. program  is  entered. A carot (^) character is printed beneath the word in
  230. error.  When a syntax error has been  found,  the  interpreter  skips  all
  231. words  up  to  the  next  semicolon.   If  there are no syntax errors, the
  232. expression is type-checked.  If  a  type  error  is  found  the  incorrect
  233. subexpression,  its  actual type, and the type expected by the interpreter
  234. are displayed.  Statements or expressions with syntax or type  errors  are
  235. not  stored  by  the  interpreter  and must be reentered.  Run-time errors
  236. cause the interpreter to abandon the current evaluation and return to  the
  237. top level.  The program is retained and may be corrected.
  238.  
  239.  
  240.  
  241. 9.   Additional features
  242.  
  243. The interpreter supports a number  of  language  features  which  are  not
  244. described in the "Hope Tutorial".  These are as follows:
  245.  
  246. (a)  Synonyms may be declared for user-defined or built-in data types, e.g.
  247.  
  248.      type word == list ( char ) ;
  249.  
  250. Objects  of  type  "word"  will  be  treated  as  "list  (  char  )"   for
  251. type-checking and when printing the type of results.
  252.  
  253.  
  254. (b)  Synonyms may also be declared for objects matched in  patterns  using
  255. the  "&" connective.  The synonym name must precede the "&".  This is used
  256. to  avoid  repeating  complex  expressions  on  the  right-hand-sides   of
  257. recursion equations e.g.
  258.  
  259. --- f ( l & ( h :: t ) ) <= if h = 10 then g ( t ) else g ( l ) ;
  260.  
  261.  
  262. Using IC-Hope on the Archimedes                                      Page 4
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269. (c)  Mutually recursive types may be declared using "with", e.g.
  270.  
  271.      data LispList == NIL ++ CONS ( LispItem # LispList )
  272.      with LispItem == ATOM ( num ) ++ LIST ( LispList ) ;
  273.  
  274.  
  275. (d) A restricted form of lazy evaluation is provided by  the  'lazy  cons'
  276. list constructor ":::".  This does not evaluate its second argument unless
  277. its value is required (this includes pattern-matching).  E.g.
  278.  
  279.      >: 1 ::: [ 2 div 0 ] ;
  280.      >: 1 ::: [ ( 2 div 0 ) ] : list ( num )
  281.  
  282. This allows infinite lists to be constructed and manipulated.   There  are
  283. no  other  lazy operations and other types of data may only be constructed
  284. eagerly.
  285.  
  286.  
  287. (e) The data type "set ( alpha )"  is  supported.   Sets  are  denoted  by
  288. sequences of expressions within braces; duplicated values will only appear
  289. once:
  290.  
  291.      >: { 1, 1+1, 2-1, 3, 3-1 } ;
  292.      >: { 1 , 3 , 2 } : set ( num )
  293.  
  294. The empty set is denoted by empty  braces  or  by  using  the  constructor
  295. "empty".  No other set constructors are provided, and functions should not
  296. pattern-match on nonempty sets.  The following built-in  functions  (types
  297. and fixities in section 6 above) are provided over sets:
  298.  
  299.      minus      set difference
  300.      intersect  set intersection
  301.      union      set union
  302.      isin       is specified item in set?
  303.      subset     is first set a subset of second?
  304.      bisect     split set into two equal-sized subsets and return both
  305.      split      remove arbitrary item from nonempty set and return both
  306.      size       number of elements in a set
  307.  
  308.  
  309. (f) The following functions (types given in section 6  above)  allow  more
  310. control  over  input-output.   Most have side-effects on files and are not
  311. referentially transparent:
  312.  
  313.      show       identity function printing its argument on the terminal
  314.      print      print a list of characters on the terminal
  315.      nl         end-of-line character sequence
  316.      openin     open an external file by name and return an input stream
  317.      openout    open an external file by name and return an output stream
  318.      getchar    read a character and advance the input stream
  319.      putchar    write a character and advance the output stream
  320.      putlist    write a list of lists of characters to an output stream
  321.      close      close the file associated with a stream
  322.      eof        end-of-file character sequence; returned as last character
  323.                 of an input file, closes an output file when written.
  324.  
  325.  
  326.  
  327.  
  328. Using IC-Hope on the Archimedes                                      Page 5
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335. 10.  System commands
  336.  
  337. The interpreter provides a set of commands to assist with  program  entry,
  338. debugging  and  modification.   All  commands start with the command name,
  339. followed by zero or more parameters separated by spaces  and  end  with  a
  340. semicolon.
  341.  
  342.  
  343.      display      causes the interpreter to list the program.
  344.  
  345. The text is reconstructed from the stored internal  form  and  may  differ
  346. from  what  was  originally  entered  in  layout  and in the bracketing of
  347. expressions. It is displayed in the  order:  operator  declarations;  type
  348. variable  declarations;   data  definitions; function definitions with the
  349. equations grouped together after the declaration.
  350.  
  351. The priorities of all operations are shown explicitly by the insertion  of
  352. extra  parentheses.   Comments  are not stored and are not displayed.  The
  353. listing can be made more selective by following "display" with one of  the
  354. parameters  "typevar", "operator", "data" or "function", or by the name of
  355. a single function.
  356.  
  357.  
  358.      save           causes the interpreter to save the complete program in
  359.                     source form on an external file.
  360.  
  361. The filename is given as the parameter of the "save" command, enclosed  in
  362. double  quotes,  and should be 240 characters long or less.  The format of
  363. the saved source is the same as for "display"  except  that  all  function
  364. declarations  are saved before any recursion equations.  This ensures that
  365. all functions will be declared before they  are  used  when  the  file  is
  366. reloaded.
  367.  
  368.  
  369.      load           causes the interpreter to read in a program contained
  370.                     in an external file.
  371.  
  372. The filename is given as the parameter of the "load" command  and  follows
  373. the  conventions  given above for "save".  The source file can be produced
  374. by an earlier "save" command, or by  a  text  editor,  allowing  top-level
  375. applications  to  be  included.   They will be executed immediately as the
  376. file is loaded.  If a source file produced by a text editor is loaded  and
  377. resaved, it will be reformatted and any comments will be lost.
  378.  
  379.  
  380.      modify         allows the stored internal form of a single function
  381.                     to be edited.
  382.  
  383. The name of the function is given as the parameter of the command.   There
  384. is  no way to alter typevar, data or infix priority declarations except by
  385. editing a saved version of the program and reloading it.
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394. Using IC-Hope on the Archimedes                                      Page 6
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401. The "modify" command is interactive and all replies may be abbreviated  to
  402. a  single letter, shown by brackets in the message.  The interpreter first
  403. displays the function declaration and asks if you want to change it; reply
  404. "(y)es"  if  you do. Other replies are taken as "(n)ext" and the recursion
  405. equations are displayed.  You will be prompted for the type  part  of  the
  406. declaration.   Terminate the type with a semicolon in the usual way.  When
  407. you change a declaration the whole  program  is  re-typechecked  when  the
  408. "modify"  command  is  complete,  and  type  errors  may  appear for other
  409. functions.
  410.  
  411. The recursion equations are then  displayed  one  at  a  time.   For  each
  412. equation  you have the option of deleting or replacing it, or adding a new
  413. equation before or after it.  Reply "(d)elete",  "(r)eplace",  "(b)efore",
  414. or  "(a)fter"  respectively.   Other replies are taken as "(n)ext" and the
  415. following equation is displayed.   For  "delete"  you  will  be  asked  to
  416. confirm  your  intention; reply "(y)es" to confirm the deletion.  In other
  417. cases you  will  be  prompted  for  a  new  equation  without  the  "---".
  418. Terminate the equation with a semicolon.
  419.  
  420. If the new declaration or recursion equation which you  enter  has  syntax
  421. errors  you  will  be  asked  whether  you  want to enter it again.  Reply
  422. "(a)gain" to try again.  Other replies are taken as "(n)ext" and  the  old
  423. version is kept.
  424.  
  425.  
  426.      echo           controls the listing of loaded programs.
  427.  
  428. The parameter "off" suppresses the listing of programs entered  by  "load"
  429. commands,  speeding up loading.  Any lines containing errors will still be
  430. displayed.  Listings can be restored by the parameter "on".  The state  of
  431. the switch is displayed if the parameter is omitted.
  432.  
  433.  
  434.      trace          causes the interpreter to display information about
  435.                     the evaluation of selected functions.
  436.  
  437. The names of the functions to be traced are given as parameters  or  "all"
  438. can  be  specified  to trace all functions in the program.  Tracing of the
  439. selected functions is started  by  entering  "trace  on"  and  stopped  by
  440. entering  "trace  off".  If the parameter is omitted, the interpreter will
  441. display the currently selected  functions  and  the  state  of  the  trace
  442. switch.
  443.  
  444.  
  445.      notrace      suppresses the tracing of specified functions.
  446.  
  447. The names of the functions which  are  not  to  be  traced  are  given  as
  448. parameters  or  "all"  can  be  specified  to  suppress the tracing of all
  449. functions in the program.
  450.  
  451.  
  452.      time           controls the timing of programs.
  453.  
  454. The parameter "on" causes the interpreter to give the evaluation  time  of
  455. top-level  expressions.   Use  "off"  to  turn  off  timing  and  omit the
  456. parameter to show the state of the timing  switch.   Execution  times  are
  457. given in milliseconds.
  458.  
  459.  
  460. Using IC-Hope on the Archimedes                                      Page 7
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.      exit           gets out of the interpreter.
  468.  
  469. You can also get out of the interpreter if it is expecting terminal  input
  470. by  entering control-D as the FIRST character of the input line, to signal
  471. end-of-file.   Runaway  recursion  in  user-defined  functions  cannot  be
  472. stopped except by pressing <reset> or <control><break>.
  473.  
  474.  
  475.      system         enters an Archimedes operating system command.
  476.  
  477. The command must be enclosed in double quotes, and care  should  be  taken
  478. not to overwrite any of the Hope system's workspace.  It is  intended  for
  479. such things as viewing directories, changing the current directory and  so
  480. on.  Running any disk-based utilities is likely to  cause  the  system  to
  481. crash.  Commands need not be prefixed with an asterisk, and are restricted
  482. to 240 characters.  If double quotes need to be included in the command  a
  483. pair of double quotes  should  be  used  for  each  double  quote  in  the
  484. command string.
  485.  
  486.  
  487.      width         controls the line width for terminal output.
  488.  
  489. The parameter sets the point at which Hope will split lines of output.  If
  490. no parameter is given, the current width value is returned.  The parameter
  491. "off" (set by default) disables the width  control  and  uses  the  entire
  492. screen width - only wrapping round at the edge of the screen.
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526. Using IC-Hope on the Archimedes                                      Page 8
  527.  
  528.  
  529.